home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / time / Time_ToAscii.c < prev    next >
C/C++ Source or Header  |  1992-03-27  |  4KB  |  179 lines

  1. /* 
  2.  * Time_ToAscii.c --
  3.  *
  4.  *    Source code for the Time_ToAscii library procedure.
  5.  *
  6.  * Copyright 1988 Regents of the University of California
  7.  * Permission to use, copy, modify, and distribute this
  8.  * software and its documentation for any purpose and without
  9.  * fee is hereby granted, provided that the above copyright
  10.  * notice appear in all copies.  The University of California
  11.  * makes no representations about the suitability of this
  12.  * software for any purpose.  It is provided "as is" without
  13.  * express or implied warranty.
  14.  */
  15.  
  16. #ifndef lint
  17. static char rcsid[] = "$Header: /sprite/src/lib/c/time/RCS/Time_ToAscii.c,v 1.5 92/03/27 13:42:48 rab Exp $ SPRITE (Berkeley)";
  18. #endif not lint
  19.  
  20. #include <sprite.h>
  21. #include <spriteTime.h>
  22. #include <string.h>
  23.  
  24. /* 
  25.  * Forward declarations:
  26.  */
  27.  
  28. static void ConvertToNum _ARGS_((char *cp, int n, Boolean blank));
  29.  
  30.  
  31. /* 
  32.  *----------------------------------------------------------------------
  33.  *
  34.  *  ConvertToNum --
  35.  *
  36.  *    Converts a number into ascii string. The blank argument,
  37.  *    if TRUE specifies blank padding, and if FALSE, specifies
  38.  *    zero padding.
  39.  *
  40.  *  Result:
  41.  *    None.
  42.  *
  43.  *  Side effects:
  44.  *    None.
  45.  *
  46.  *----------------------------------------------------------------------
  47.  */
  48.  
  49. static void
  50. ConvertToNum(cp, n, blank)
  51.     register char *cp;
  52.     int n;
  53.     Boolean blank;
  54. {
  55.     if (n>=10) {
  56.         *cp = (n/10)%10 + '0';
  57.     } else if (blank) {
  58.         *cp = ' ';
  59.     }
  60.     cp++;
  61.     *cp = n%10 + '0';
  62. }
  63.  
  64. /*
  65.  *----------------------------------------------------------------------
  66.  *
  67.  *  Time_ToAscii --
  68.  *
  69.  *    Converts a time value into a human-readable string of
  70.  *    the current (absolute) time or relative time. 
  71.  *    The current time has the form:
  72.  *        Wed, 1 Jan 86 10:24:38
  73.  *    If relative time is specified, the time value is interpreted 
  74.  *    as the difference between two absolute time values and has the form:
  75.  *        0 days, 02:45:09
  76.  *
  77.  *    Note: this routine can be simplied once a sprintf routine is available.
  78.  *
  79.  * Results:
  80.  *    None.
  81.  *
  82.  * Side effects:
  83.  *    None.
  84.  *
  85.  *----------------------------------------------------------------------
  86.  */
  87.  
  88. void
  89. Time_ToAscii(time, relativeTime, bufferPtr)
  90.     int        time;
  91.     Boolean    relativeTime;
  92.     char    *bufferPtr;
  93. {
  94.     register char     *cp, *ncp;
  95.     Time_Parts        parts;
  96.  
  97.     Time_ToParts(time, relativeTime, &parts);
  98.  
  99.  
  100.     if (relativeTime) {
  101.     (void) strcpy(bufferPtr, " 00+00:00:00");
  102.     /*               012345678901+1 for null byte*/
  103.  
  104. #define DAY_OFFSET        1
  105. #define HOUR_OFFSET         4
  106. #define MINUTE_OFFSET         7
  107. #define SECOND_OFFSET         10
  108.  
  109.     cp = &bufferPtr[SECOND_OFFSET];
  110.     ConvertToNum(cp, parts.seconds, FALSE);
  111.  
  112.     cp = &bufferPtr[MINUTE_OFFSET];
  113.     ConvertToNum(cp, parts.minutes, FALSE);
  114.  
  115.     cp = &bufferPtr[HOUR_OFFSET];
  116.     ConvertToNum(cp, parts.hours, FALSE);
  117.  
  118.     cp = &bufferPtr[DAY_OFFSET];
  119.     if (parts.dayOfYear < 0) {
  120.         bufferPtr[0] = '-';
  121.         ConvertToNum(cp, -parts.dayOfYear, TRUE);
  122.     } else {
  123.         ConvertToNum(cp, parts.dayOfYear, TRUE);
  124.     }
  125.  
  126.  
  127.     } else {
  128.  
  129.     /*
  130.      * Use the Arpanet standard format for date & time.
  131.      * The timezone is ignored for now (goes at the end of the line).
  132.      */
  133.  
  134.     (void) strcpy(bufferPtr, "Day, DD MMM YY 00:00:00");
  135.     /*               01234567890123456789012 +1 for null byte*/
  136.  
  137. #define DAY_OF_WEEK     0
  138. #define DAY_OF_MONTH     5
  139. #define MONTH         8
  140. #define YEAR         12
  141. #define HOUR         15
  142. #define MINUTE         18
  143. #define SECOND         21
  144. #define TIMEZONE     24
  145.  
  146.     cp = &bufferPtr[SECOND];
  147.     ConvertToNum(cp, parts.seconds, FALSE);
  148.  
  149.     cp = &bufferPtr[MINUTE];
  150.     ConvertToNum(cp, parts.minutes, FALSE);
  151.  
  152.     cp = &bufferPtr[HOUR];
  153.     ConvertToNum(cp, parts.hours, FALSE);
  154.  
  155.     ncp = &"SunMonTueWedThuFriSat"[3* parts.dayOfWeek ];
  156.     cp = &bufferPtr[DAY_OF_WEEK];
  157.     cp[0] = ncp[0];
  158.     cp[1] = ncp[1];
  159.     cp[2] = ncp[2];
  160.     cp += 3;
  161.     ncp += 3;
  162.  
  163.     cp = &bufferPtr[YEAR];
  164.     ConvertToNum(cp, parts.year, FALSE);    /* last 2 digits of year */
  165.  
  166.     cp = &bufferPtr[MONTH];
  167.     ncp = &"JanFebMarAprMayJunJulAugSepOctNovDec"[parts.month*3];
  168.     cp[0] = ncp[0];
  169.     cp[1] = ncp[1];
  170.     cp[2] = ncp[2];
  171.     cp += 3;
  172.     ncp += 3;
  173.  
  174.     cp = &bufferPtr[DAY_OF_MONTH];
  175.     ConvertToNum(cp, parts.dayOfMonth, TRUE);
  176.     }
  177.  
  178. }
  179.